package com.example.guardian.client.proxy;

import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.rpc.service.GenericService;

/**
 * dubbo 泛化调用
 *
 * @author gang.wang 2021/10/22
 */
public class InvokeService {

    /**
     * dubbo 泛化调用
     */
    public Object preTransaction(){
        // 引用远程服务
        // 该实例很重量，里面封装了所有与注册中心及服务提供方连接，请缓存
        ReferenceConfig<InvokeService> reference = new ReferenceConfig<InvokeService>();
        // 弱类型接口名
        reference.setInterface("com.example.guardian.client.message.TransactionMessageService");
        reference.setVersion("1.0.0");
        // 声明为泛化接口
        reference.setGeneric(true);

        // 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
        GenericService genericService = (GenericService)reference.get();

        // 基本类型以及Date,List,Map等不需要转换，直接调用
        Object result = genericService.$invoke("initPreMessage", new String[] {"java.lang.String"}, new Object[] {"world"});
        return result;
    }

    /**
     * dubbo 泛化调用
     */
    public Object confirmInvoke(String messageId){
        // 引用远程服务
        // 该实例很重量，里面封装了所有与注册中心及服务提供方连接，请缓存
        ReferenceConfig<InvokeService> reference = new ReferenceConfig<InvokeService>();
        // 弱类型接口名
        reference.setInterface("com.example.guardian.client.message.TransactionMessageService");
        reference.setVersion("1.0.0");
        // 声明为泛化接口
        reference.setGeneric(true);

        // 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
        GenericService genericService = (GenericService)reference.get();

        // 基本类型以及Date,List,Map等不需要转换，直接调用
        Object result = genericService.$invoke("confirmSendMessage", new String[] {"java.lang.String"}, new Object[] {messageId});
        return result;
    }

    /**
     * 确认消费dubbo 泛化调用
     */
    public Object invokeConsumer(String messageId){
        // 引用远程服务
        // 该实例很重量，里面封装了所有与注册中心及服务提供方连接，请缓存
        ReferenceConfig<InvokeService> reference = new ReferenceConfig<InvokeService>();
        // 弱类型接口名
        reference.setInterface("com.example.guardian.client.message.TransactionMessageService");
        reference.setVersion("1.0.0");
        // 声明为泛化接口
        reference.setGeneric(true);

        // 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
        GenericService genericService = (GenericService)reference.get();

        // 基本类型以及Date,List,Map等不需要转换，直接调用
        Object result = genericService.$invoke("confirmConsumerMessage", new String[] {"java.lang.String"}, new Object[] {messageId});
        return result;
    }

    /**
     * 根据group调用服务
     */
    public Object invokeByGroup(String messageId, String groupId){
        // 引用远程服务
        // 该实例很重量，里面封装了所有与注册中心及服务提供方连接，请缓存
        ReferenceConfig<InvokeService> reference = new ReferenceConfig<InvokeService>();
        // 弱类型接口名
        reference.setInterface("com.example.guardian.client.message.TransactionMessageCallback");
        reference.setVersion("1.0.0");
        reference.setGroup(groupId);
        // 声明为泛化接口
        reference.setGeneric(true);

        // 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
        GenericService genericService = (GenericService)reference.get();

        // 基本类型以及Date,List,Map等不需要转换，直接调用
        Object result = genericService.$invoke("callback", new String[] {"java.lang.String"}, new Object[] {messageId});
        return result;
    }
}
